package mx.frantor.catalogos.daoimp;

import static mx.frantor.security.util.EncriptaCadena.*;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import mx.frantor.catalogos.dao.UsuariosDAO;
import mx.frantor.catalogos.entitys.UsuariosEntity;
import mx.frantor.util.HibernateUtil;

public class UsuariosDAOImpl implements UsuariosDAO{

	// Hash de encriptacion : MD5, SHA1, SHA256, SHA384, SHA512
		private final String hash = SHA256; // <-Constante para definir el nivel de Encriptado
		
	@Override
	public String agregarUsuarios(UsuariosEntity nuevoUsuario) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		
		session.beginTransaction();
		try {
		session.save(nuevoUsuario);
		session.flush();
		session.getTransaction().commit();
		e = nuevoUsuario.getIdUsuario().toString();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();

			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("agregar usuarios resultado " + e);

		return e;
	}

	@Override
	public String modificarUsuarios(UsuariosEntity modificarUsuario) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
	
		session.beginTransaction();
		try {
			UsuariosEntity usuariosTemp = (UsuariosEntity) session.get(
					UsuariosEntity.class, modificarUsuario.getIdUsuario());
		session.flush();
		session.evict(usuariosTemp);
		modificarUsuario.setBlock(usuariosTemp.getBlock());
		session.update(modificarUsuario);
		session.getTransaction().commit();

		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();

			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("modificar usuarios resultado " + e);

		return e;
	}

	@Override
	public String eliminarUsuario(Integer idUsuario) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		

			// TODO Auto-generated method stub			
			session.beginTransaction();
			try {
				UsuariosEntity usuarioElimina = (UsuariosEntity) session.get(
						UsuariosEntity.class, idUsuario);
			session.delete(usuarioElimina);
			session.getTransaction().commit();

		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();

			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("eliminar usuarios resultado " + e);

		return e;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<UsuariosEntity> getTodosUsuariosActivos() {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<UsuariosEntity> usuarios = session.createCriteria(UsuariosEntity.class)
				.addOrder(Order.asc("NickName")).list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return usuarios;
	}

	@SuppressWarnings("unchecked")
	@Override
	public UsuariosEntity getUsuarioId(Integer idUsuario) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<UsuariosEntity> usuario = (List<UsuariosEntity>) session.createCriteria(UsuariosEntity.class)
				.add(Restrictions.eq("IdUsuario", idUsuario))
				.setFetchSize(1).list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		if(usuario==null){
			return null;
		}else{
			return usuario.get(0);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<UsuariosEntity> getUsuarioPorId(Integer idUsuario) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<UsuariosEntity> usuario = (List<UsuariosEntity>) session.createCriteria(UsuariosEntity.class)
				.add(Restrictions.eq("IdUsuario", idUsuario))
				.list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return usuario;
	}

	@Override
	public UsuariosEntity validaUsuario(String inUsr, String inPwd) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		@SuppressWarnings("unchecked")
		List<UsuariosEntity> usrValido = session.createCriteria(UsuariosEntity.class)
					.add(Restrictions.eq("NickName", inUsr))
					.add(Restrictions.eq("Password",getDigest(inPwd, hash)))
					.setFetchSize(1).list();
		session.getSessionFactory().getCurrentSession().close();
		try{
			return usrValido.get(0);
		}catch(Exception err){
			System.out.println("El usuario "+ inUsr +" no existe o es invalido: " + err.getMessage());
			return null;
		}
	}

	@Override
	public String restriccionesUsuarios(Integer idUsuario, String Block) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
	
		session.beginTransaction();
		try {
			UsuariosEntity usuariosTemp = (UsuariosEntity) session.get(
					UsuariosEntity.class, idUsuario);
		session.flush();
		session.evict(usuariosTemp);
		usuariosTemp.setBlock(Block);
		session.update(usuariosTemp);
		session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return e;
	}

}
